package com.pan.games.info;

/**
 *
 * 简单解释一下J.U.C，是JDK中提供的并发工具包,java.util.concurrent。
 * 里面提供了很多并发编程中很常用的实用工具类，比如atomic原子操作、比如lock同步锁、fork/join等
 * @author by panstark
 * @description
 * @notice
 * @date 2020/12/16
 */
public class AQSInfo {

    /**
     * aqs全称为AbstractQueuedSynchronizer，它提供了一个FIFO队列，
     * 可以看成是一个用来实现同步锁以及其他涉及到同步功能的核心组件，常见的有:ReentrantLock、CountDownLatch等。
     * AQS是一个抽象类，主要是通过继承的方式来使用，它本身没有实现任何的同步接口，仅仅是定义了同步状态的获取以及释放的方法来提供自定义的同步组件。
     * 可以这么说，只要搞懂了AQS，那么J.U.C中绝大部分的api都能轻松掌握。
     */

    /**
     * 从使用层面来说，AQS的功能分为两种：独占和共享
     *
     * 独占锁，每次只能有一个线程持有锁，比如前面给大家演示的ReentrantLock就是以独占方式实现的互斥锁
     * 共享锁，允许多个线程同时获取锁，并发访问共享资源，比如ReentrantReadWriteLock
     */

    /**
     * AQS的实现依赖内部的同步队列,也就是FIFO的双向队列，
     * 如果当前线程竞争锁失败，那么AQS会把当前线程以及等待状态信息构造成一个Node加入到同步队列中，同时再阻塞该线程。
     * 当获取锁的线程释放锁以后，会从队列中唤醒一个阻塞的节点(线程)。
     */

    /**
     *我们在第一节中讲到，AQS框架分离了构建同步器时的一系列关注点，
     * 它的所有操作都围绕着资源——同步状态（synchronization state）来展开因此，围绕着资源，衍生出三个基本问题：
     * 同步状态（synchronization state）的管理
     * 阻塞/唤醒线程的操作
     * 线程等待队列的管理
     */

    /**
     * 同步状态，其实就是资源。AQS使用单个int（32位）来保存同步状态，并暴露出getState、setState以及compareAndSetState操作来读取和更新这个状态。
     */

    /**
     * 等待队列，是AQS框架的核心，整个框架的关键其实就是如何在并发状态下管理被阻塞的线程。
     * 等待队列是严格的FIFO队列，是Craig，Landin和Hagersten锁（CLH锁）的一种变种，采用双向链表实现，因此也叫CLH队列。
     */
}
